<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script>

    // 手写new操作符(Obj:构造函数)
      // 1、创建空对象
      // 2、将空对象的_proto_ 指向 构造函数的原型
      // 3、改变this.指向
      // 4、返回值（构造函数有返回对象则返回该对象，没有则返回空对象）
    function myNew(Obj,...args){
      let obj = Object.create(Obj.prototype)  //完成1和2
      let res = Obj.call(obj, ...args)   // 使用call调用Obj构造函数并传入参数，this指向obj
      // 判断构造函数是否返回对象或函数
      if(res && ((typeof res) === "object" || (typeof res) === "function")){
        return res
      }
      return obj
    }

    function Obj(name){
      this.name = name
      // return {a:11}
    }
    Obj.prototype.sayName = function(){
      console.log(this.name)
    }
    let obj =  myNew(Obj,'aa')
    console.log(obj)
    obj.sayName()
    console.log(new Obj("bb"))
  </script>

</body>
</html>